Se trabajará sobre un dataset del e-commerce brasileño Olist Store.
Se tiene información de pedidos entre los años 2016 a 2018.
Los datos permiten analizar un pedido desde múltiples dimensiones: desde el estado del pedido, el precio, el pago y el rendimiento del proceso de entrega, los atributos del producto y finalmente las revisiones escritas por los clientes.
Se cuenta con un conjunto de datos de geolocalización que relaciona los códigos postales brasileños con las coordenadas latitud y longitud.
Ejemplo de un producto en la pagina de Olist
Este conjunto de datos tiene información sobre el cliente y su ubicación. Usarlo para identificar clientes únicos en el dataset de pedidos/ordenes y para encontrar la ubicación de entrega de pedidos.
En este sistema, cada pedido se asigna a un cliente único. Esto significa que el mismo cliente obtendrá diferentes ID para diferentes pedidos. El propósito de tener un cliente_unique_id en el conjunto de datos es permitir identificar a los clientes que hicieron recompras en la tienda. De lo contrario, encontraría que cada pedido tiene un cliente diferente asociado.
La tabla de Clientes comprende las siguientes columnas:
customer_id: clave de la orden de compra del dataset. Cada orden tiene un unico customer_id.
customer_unique_id: Identificador unico del cliente.
customer_zip_code_prefix: Primeros cinco dígitos del código postal del cliente.
customer_city: Nombre de la ciudad del cliente.
customer_state: Nombre del estado donde se encuentra el cliente
info_clientes()
Se tiene un total de 99441 filas y 5 columnas No se encuentran valores nulos
| customer_id | customer_unique_id | customer_zip_code_prefix | customer_city | customer_state | |
|---|---|---|---|---|---|
| 0 | 06b8999e2fba1a1fbc88172c00ba8bc7 | 861eff4711a542e4b93843c6dd7febb0 | 14409 | franca | SP |
| 1 | 18955e83d337fd6b2def6b18a428ac77 | 290c77bc529b7ac935b93aa66c333dc3 | 9790 | sao bernardo do campo | SP |
| 2 | 4e7b3e00288586ebd08712fdd0374a03 | 060e732b5b29e8181a18229c7b0b2b5e | 1151 | sao paulo | SP |
distribucion_clientes()
Se encuentran clientes de 4119 diferentes ciudades distribuidos en 27 estados de los cuales el 41.98 % se encuentra en Sao Paulo
Este dataset incluye datos sobre los vendedores que cumplieron los pedidos realizados en Olist. Usarlo para encontrar la ubicación del vendedor e identificar qué vendedor cumplió cada producto.
La tabla de Productos comprende las siguientes columnas:
seller_id:Identificador unico del vendedor.
seller_zip_code: Primeros 5 dígitos de código postal del vendedor.
seller_city: Nombre de la ciudad del vendedor.
seller_state: Nombre del estado donde vive el vendedor.
info_vendedores()
Se tiene un total de 3095 filas y 4 columnas No se encuentran valores nulos
| seller_id | seller_zip_code_prefix | seller_city | seller_state | |
|---|---|---|---|---|
| 0 | 3442f8959a84dea7ee197c632cb2df15 | 13023 | campinas | SP |
| 1 | d1b65fc7debc3361ea86b5f14c68d2e2 | 13844 | mogi guacu | SP |
| 2 | ce3ad9de960102d0677a81f5d0bb7b2d | 20031 | rio de janeiro | RJ |
grafico_vendedores()
El 59.74% de los vendedores se encuentran en SP (Sao Pablo) y el resto se encuentran distribuidos en los demas 22 estados
Este conjunto de datos tiene información con códigos postales brasileños y sus coordenadas LAT/LONG. Usarlo para trazar mapas y encontrar distancias entre vendedores y clientes.
La tabla de Geolocalizacion comprende las siguientes columnas:
geolocation_zip_code_prefix: Primeros cinco dígitos del código postal del cliente
geolocation_lat: latidud
geolocation_lng: Longitud
geolocation_city: Ciudad
geolocation_state: Estado
info_geolocalizacion()
Se tiene un total de 1000163 filas y 5 columnas No se encuentran valores nulos
| geolocation_zip_code_prefix | geolocation_lat | geolocation_lng | geolocation_city | geolocation_state | |
|---|---|---|---|---|---|
| 0 | 1037 | -23.545621 | -46.639292 | sao paulo | SP |
| 1 | 1046 | -23.546081 | -46.644820 | sao paulo | SP |
| 2 | 1046 | -23.546129 | -46.642951 | sao paulo | SP |
La mayor parte del país se halla dentro del hemisferio sur, entre los paralelos 5.5 de latitud N, y los -34 de latitud S; y entre los meridianos que señalan los -32 y los -74 de longitud.
outiers_geo()
Luego del analisis se encontraron 31 Outliers
Normalizamos la tabla Geolocalizacion corrigiendo los outliers con Geopy para luego graficar el mapa de clientes
clientes = clientes_etl(clientes)
geoloc_filtrado.head()
| Id_Geolocalizacion | zip_code_prefix | Latitud | Longitud | Ciudad | Estado | |
|---|---|---|---|---|---|---|
| 0 | 0 | 1001 | -23.550190 | -46.634024 | sao paulo | SP |
| 1 | 1 | 1002 | -23.548146 | -46.634979 | sao paulo | SP |
| 2 | 2 | 1003 | -23.548994 | -46.635731 | sao paulo | SP |
| 3 | 3 | 1004 | -23.549799 | -46.634757 | sao paulo | SP |
| 4 | 4 | 1005 | -23.549456 | -46.636733 | sao paulo | SP |
clientes['Latitud'] = clientes.apply(lambda r: geoloc_filtrado[geoloc_filtrado.Id_Geolocalizacion==r.Id_Geolocalizacion].Latitud.values[0], axis =1)
clientes['Longitud'] = clientes.apply(lambda r: geoloc_filtrado[geoloc_filtrado.Id_Geolocalizacion==r.Id_Geolocalizacion].Longitud.values[0], axis =1)
mapCustomers = folium.Map(location=[-15.7941, -47.8825],
tiles='cartodbpositron',
# width=700, height=400,
zoom_start=5)
HeatMap(data=clientes[['Latitud', 'Longitud']],
radius=13).add_to(mapCustomers)
<folium.plugins.heat_map.HeatMap at 0x1d71d17e3e0>
print('¿De dónde están los clientes activos?: ')
mapCustomers
¿De dónde están los clientes activos?:
Este dataset incluye datos sobre los elementos comprados dentro de cada pedido.
La tabla de Items comprende las siguientes columnas:
order_id: Identificador unico de la orden de compra.
order_item_id: número secuencial de identificación de elementos incluidos en la misma orden.
product_id: Identificador unico del producto
seller_id: Identificador unico del vendedor
shipping_limit_date: Muestra la fecha de límite de envío del vendedor para manejar el pedido con el socio logístico.
price: Precio del item.
freight_value: valor de flete (si un pedido tiene más de un elemento, el valor del flete se divide entre los elementos)
info_items()
Se tiene un total de 112650 filas y 7 columnas No se encuentran valores nulos
| order_id | order_item_id | product_id | seller_id | shipping_limit_date | price | freight_value | |
|---|---|---|---|---|---|---|---|
| 0 | 00010242fe8c5a6d1ba2dd792cb16214 | 1 | 4244733e06e7ecb4970a6e2683c13e61 | 48436dade18ac8b2bce089ec2a041202 | 2017-09-19 09:45:35 | 58.9 | 13.29 |
| 1 | 00018f77f2f0320c557190d7a144bdd3 | 1 | e5f2d52b802189ee658865ca93d83a8f | dd7ddc04e1b6c2c614352b383efe2d36 | 2017-05-03 11:05:13 | 239.9 | 19.93 |
| 2 | 000229ec398224ef6ca0657da4fc703e | 1 | c777355d18b72b67abbeef9df44fd0fd | 5b51032eddd242adc84c38acab88f23d | 2018-01-18 14:48:30 | 199.0 | 17.87 |
grafico_items()
El 75% de los precios esta por debajo de R$134.90
Este dataset incluye datos sobre las opciones de pago de los pedidos.
La tabla de Metodo de Pago comprende las siguientes columnas:
order_id: Identificador unico de la orden de compra.
payment_sequential: Un cliente puede pagar un pedido con más de un método de pago. Si lo hace, se creará una secuencia.
payment_type: Metodo de pago elegido por el cliente
payment_installments: Número de cuotas elegidas por el cliente.
payment_value: valor de la transacción.
info_metodo_de_pago()
Se tiene un total de 103886 filas y 5 columnas No se encuentran valores nulos
| order_id | payment_sequential | payment_type | payment_installments | payment_value | |
|---|---|---|---|---|---|
| 0 | b81ef226f3fe1789b1e8b2acac839d17 | 1 | credit_card | 8 | 99.33 |
| 1 | a9810da82917af2d9aefd1278f1dcfa0 | 1 | credit_card | 1 | 24.39 |
| 2 | 25e8ea4e93396b6fa0d3dd708e76c1bd | 1 | credit_card | 1 | 65.71 |
grafico_medio_de_pago()
grafico_cuotas()
El 75% de los clientes pago en 4 cuotas o menos y la mayoria de los clientes prefieren pagar en una cuota (el 50.5%)
Después de que un cliente compra el producto en Olist Store, se notifica al vendedor para cumplir ese pedido. Una vez que el cliente recibe el producto, o la fecha de entrega estimada, el cliente recibe una encuesta de satisfacción por correo electrónico donde puede dar una nota para la experiencia de compra y escribir algunos comentarios.
La tabla de Reviews comprende las siguientes columnas:
review_id: Identificador unico de la revision.
order_id: Identificador unico de la orden de compra.
review_score: Nota que varía de 1 a 5 dada por el cliente en una encuesta de satisfacción.
review_comment_title: Título de comentario de la revisión dejada por el cliente, en portugués.
review_comment_message: Mensaje de comentario de la revisión dejada por el cliente, en portugués.
review_creation_date: Muestra la fecha en que se envió la encuesta de satisfacción al cliente.
review_answer_timestamp: Muestra dia y hora de la encuesta de satisfacción.
info_reviews()
Se tiene un total de 99224 filas y 7 columnas
| review_id | order_id | review_score | review_comment_title | review_comment_message | review_creation_date | review_answer_timestamp | |
|---|---|---|---|---|---|---|---|
| 0 | 7bc2406110b926393aa56f80a40eba40 | 73fc7af87114b39712e6da79b0a377eb | 4 | NaN | NaN | 2018-01-18 | 2018-01-18 21:46:59 |
| 1 | 80e641a11e56f04c1ad469d5645fdfde | a548910a1c6147796b98fdf73dbeba33 | 5 | NaN | NaN | 2018-03-10 | 2018-03-11 03:05:13 |
| 2 | 228ce5500dc1d8e020d8d1322874b6f0 | f9e4b658b201a9f2ecdecbb34bed034b | 5 | NaN | NaN | 2018-02-17 | 2018-02-18 14:36:24 |
Aqui nos encontramos valores nulos en el mensaje de las revisiones y en el titulo de la revision. Pero el score de la revision no tiene nulos. Es un valor numerico entre 1 y 5
grafico_reviws()
El 57.78% de las revisiones corresponden a 5 y el 11.51% a 1
Este es el conjunto de datos principal. De cada pedido se puede encontrar toda la otra información.
La tabla de ordenes comprende las siguientes columnas:
order_id: Identificador unico del orden de compra
customer_id: clave de la orden de compra. Cada orden tiene un unico customer_id.
order_status: Referencia del estado de la orden (entregada, enviada, etc).
order_purchase_timestamp: Muestra dia y hora de la compra.
order_approved_at: Muestra dia y hora del pago aprobado
order_delivered_carrier_date: Muestra fecha y hora de entregado el pedido al transportista.
order_delivered_customer_date: Muestra la fecha real de entrega del pedido al cliente.
order_estimated_delivery_date: Muestra la fecha de entrega estimada que se informó al cliente en el momento de compra.
info_ordenes()
Se tiene un total de 99441 filas y 8 columnas
| order_id | customer_id | order_status | order_purchase_timestamp | order_approved_at | order_delivered_carrier_date | order_delivered_customer_date | order_estimated_delivery_date | |
|---|---|---|---|---|---|---|---|---|
| 0 | e481f51cbdc54678b7cc49136f2d6af7 | 9ef432eb6251297304e76186b10a928d | delivered | 2017-10-02 10:56:33 | 2017-10-02 11:07:15 | 2017-10-04 19:55:00 | 2017-10-10 21:25:13 | 2017-10-18 |
| 1 | 53cdb2fc8bc7dce0b6741e2150273451 | b0830fb4747a6c6d20dea0b8c802d7ef | delivered | 2018-07-24 20:41:37 | 2018-07-26 03:24:27 | 2018-07-26 14:31:00 | 2018-08-07 15:27:45 | 2018-08-13 |
| 2 | 47770eb9100c2d0c44946d9cf07ec65d | 41ce2a54c0b03bf3443c3d931a367089 | delivered | 2018-08-08 08:38:49 | 2018-08-08 08:55:23 | 2018-08-08 13:50:00 | 2018-08-17 18:06:29 | 2018-09-04 |
Encontramos algunos valores nulos en order_approved_at, order_delivered_carrier_date, order_delivered_customer_date
Evaluar las diferencias entre:
diferencias()
La diferencia entre la compra y el pago aprobado es de 0 days 10:25:08.739486910 La diferencia entre el pago aprobado y el despacho es de 2 days 19:19:15.298850927 La diferencia entre el despacho y la entrega es de 9 days 07:55:59.254148743 La diferencia entre la entrega real y la entrega pactada es de 11 days 04:17:55.957616402
Este dataset incluye datos sobre los productos vendidos por Olist.
La tabla de Productos comprende las siguientes columnas:
product_id: Identificador unico del producto.
product_category_name: Nombre de la categoria del producto, en portugués.
product_name_length: Número de caracteres extraídos del nombre del producto.
product_description_lenght: Número de caracteres extraídos de la descripción del producto.
product_photos_qty: Número de fotos publicadas por el producto.
product_weight_g: Peso del producto medido en gramos.
product_length_cm: Longitud del producto medida en centímetros.
product height_cm: Altura del producto medida en centímetros.
product_width_cm: Ancho del producto medido en centímetros.
def info_productos():
print("Se tiene un total de {} filas y {} columnas".format(productos.shape[0],productos.shape[1]))
return productos.head(3)
info_productos()
Se tiene un total de 32951 filas y 9 columnas
| product_id | product_category_name | product_name_lenght | product_description_lenght | product_photos_qty | product_weight_g | product_length_cm | product_height_cm | product_width_cm | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1e9e8ef04dbcff4541ed26657ea517e5 | perfumaria | 40.0 | 287.0 | 1.0 | 225.0 | 16.0 | 10.0 | 14.0 |
| 1 | 3aa071139cb16b67ca9e5dea641aaa2f | artes | 44.0 | 276.0 | 1.0 | 1000.0 | 30.0 | 18.0 | 20.0 |
| 2 | 96bd76ec8810374ed1b65e291975717f | esporte_lazer | 46.0 | 250.0 | 1.0 | 154.0 | 18.0 | 9.0 | 15.0 |
Se encuentran valores nulos en product_category_name,
product_name_lenghty product_description_lenght
Este dataset traduce las categorias de los productos al inglés. Evaluar si lo necesitamos en español. Usar la api de google translate para eso.
La tabla de Productos_info comprende las siguientes columnas:
product_category_name: Nombre de categoría en portugués.
product_name_english: Nombre de categoría en inglés.
def info_productos_info():
print("Se tiene un total de {} filas y {} columnas".format(productos_info.shape[0],productos_info.shape[1]))
print('No se encuentran valores nulos')
return productos_info.head(3)
info_productos_info()
Se tiene un total de 71 filas y 2 columnas No se encuentran valores nulos
| product_category_name | product_category_name_english | |
|---|---|---|
| 0 | beleza_saude | health_beauty |
| 1 | informatica_acessorios | computers_accessories |
| 2 | automotivo | auto |